iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 12
1

DataBinding

DataBinding是實現數據和UI雙向綁定的框架,可以用來構建MVVM的架構讓數據可以直接绑定到布局上,省去大部分的程式碼。

<layout>:使用DataBinding,必須要在佈局的最外層包layout標籤。
<data>:用來承載資料的,內部可以定義多個import標籤和variable標籤。
<variable>:用來把布局與程式碼綁定,每個variable標籤的name屬性值不可相同,但type屬性值可以相同。
name:用於定義資料來源的名稱。
type:用於定義資料來源所在路徑。
@{"操作行為"}:單向綁定。
@={"操作行為"}:雙向綁定,資料會兩邊相同,當EditText輸入文字時資料會即時傳回。
DataBindingUtil.setContentView:生成DataBinding,類別為layout名稱的大寫+Binding。
android {
    buildFeatures {
        dataBinding true
    }
}

dependencies {
    implementation "androidx.fragment:fragment-ktx:1.2.5"
}

對著ConstraintLayout(ViewGroup)按下Alt+Enter

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="viewModel"
            type="com.example.myapplication.MyVM" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <EditText
            android:id="@+id/editTextTextPersonName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="220dp"
            android:ems="10"
            android:inputType="textPersonName"
            android:text="@={viewModel.name}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.497"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:onClick="@{viewModel::change}"
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="196dp"
            android:text="change"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.498"
            app:layout_constraintStart_toStartOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

創建VM

class MyVM : ViewModel(){
    var name = MutableLiveData<String>()

    //改變textview文字
    fun change(view: View) {
        name.value = "hello"
    }
}

View與VM綁定

class MainActivity : AppCompatActivity() {

    private val myViewModel by viewModels<MyVM>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.viewModel = myViewModel

        myViewModel.name.observe(this, Observer {
            binding.textView.text = it
        })
    }
}


上一篇
{Day11} Repository
下一篇
{Day13}ViewBinding
系列文
Kotlin Android Jetpack 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言